package com.skyline.common.reflection;

import java.lang.reflect.Array;
import java.util.List;

/**
 * 数组操作工具类
 * 
 * @author wuqh
 * 
 */
public class ArrayUtils {
	/**
	 * 将一个元素放到数组的指定位置上，如果数组不存在将创建数组。如果数组长度不够则会自动补全到index+1的长度。
	 * 
	 * @param <T>
	 * @param array
	 * @param element
	 * @param index
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> T[] addElemToArray(T[] array, T element, int index) {
		if (array == null) {
			array = (T[]) Array.newInstance(element.getClass(), (index + 1));
			array[index] = element;
			return array;
		}
		if (index < array.length) {
			array[index] = element;
			return array;
		} else {
			T[] newArray = (T[]) Array.newInstance(element.getClass(), (index + 1));
			System.arraycopy(array, 0, newArray, 0, array.length);
			newArray[index] = element;
			return newArray;
		}

	}

	/**
	 * 获取数组或者List对象的
	 * 
	 * @param arrayOrList
	 * @return
	 */
	public static int getArrayOrListLength(Object arrayOrList) {
		if (arrayOrList == null) {
			return 0;
		}

		Class<?> clazz = arrayOrList.getClass();
		boolean isArray = TypeUtils.isTypeArray(clazz);
		boolean isList = TypeUtils.isTypeList(clazz);

		if (!isArray && !isList) {
			throw new IllegalArgumentException("arrayOrList参数必须为数组或者List的实现类");
		}

		if (isArray) {
			return Array.getLength(arrayOrList);
		} else {
			return ((List<?>) arrayOrList).size();
		}
	}

	/**
	 * 将数组对象转换为对象数组
	 * 
	 * @param source
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public static Object[] objectToArray(Object source) {
		if (source instanceof Object[]) {
			return (Object[]) source;
		}
		if (source == null) {
			return new Object[0];
		}
		if (!source.getClass().isArray()) {
			throw new IllegalArgumentException("Source is not an array: " + source);
		}
		int length = Array.getLength(source);
		if (length == 0) {
			return new Object[0];
		}
		Class wrapperType = Array.get(source, 0).getClass();
		Object[] newArray = (Object[]) Array.newInstance(wrapperType, length);
		for (int i = 0; i < length; i++) {
			newArray[i] = Array.get(source, i);
		}
		return newArray;
	}

	/**
	 * 获取数组中指定索引的对象
	 * 
	 * @param array
	 * @param index
	 * @param returnSelfInNull
	 * @return
	 */
	public static Object getObjectInArray(Object array, int index, boolean returnSelfInNull) {
		if (array == null) {
			return null;
		}

		if (!array.getClass().isArray()) {
			return returnSelfInNull ? array : null;
		}

		if (Array.getLength(array) <= index) {
			return null;
		}

		return Array.get(array, index);
	}
}
